﻿Imports CGR.SEGUR.BE
Imports System.Transactions

Imports CGR.SEGUR.UTIL

Public Class AplicacionBL

#Region "Declaración de Variable"

    Private TIPO_REST_Ambito As String = "A"
    Private TIPO_REST_Rol As String = "R"
    Private TIPO_REST_Rol_Ambito As String = "RA"
    Private TIPO_RESP_AdminSistema As String = "AD"
    Private EstadoActivo As String = "1"
    Private AdminSistema_USR_INTERNO As String = "SEGUR00012"
    Private AdminSistema_USR_INTERNO_EXTERNO As String = "SEGUR00008"
    Private USR_INTERNO_PRFIJO As String = "U"
    Private USR_EXTERNO_PRFIJO As String = "E"

#End Region

#Region "Aplicacion"

    Private Sub AplicacionValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                                  ByVal obj As AplicacionBE, ByVal usuario As String,
                                  ByRef res As ResultadoBE, ByVal token As String)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.Siglas) Then
            res.detalle = "Requiere Siglas"
            Return
        End If
        If String.IsNullOrEmpty(obj.Nombre) Then
            res.detalle = "Requiere Nombre"
            Return
        End If
        If String.IsNullOrEmpty(obj.EstadoValor) Then
            res.detalle = "Requiere Estado"
            Return
        End If
        If String.IsNullOrEmpty(obj.TipoAppCodigo) Then
            res.detalle = "Requiere Tipo Sistema"
            Return
        End If
        If String.IsNullOrEmpty(obj.Codigo) AndAlso obj.EstadoValor.Equals("0") Then
            res.detalle = "No es posible crear un sistema como inactivo"
            Return
        End If

        If Not String.IsNullOrEmpty(obj.Descripcion) Then
            If Len(obj.Descripcion) > 1000 Then
                res.detalle = "La descripción sólo acepta hasta 1000 caracteres"
                Return
            End If
        End If

        If String.IsNullOrEmpty(obj.Codigo) Then
            Dim objBuscar As New AplicacionBE()
            objBuscar.Siglas = obj.Siglas
            If srvEnt.AplicacionListarTodo(objBuscar, usuario, token).Count > 0 Then
                res.detalle = "Siglas ya registradas"
                Return
            End If
        Else
            If String.IsNullOrEmpty(obj.Contrasena) Then
                res.detalle = "Requiere Contrasena"
                Return
            End If
        End If
        res.flag = True
    End Sub

    Private Sub AplicacionContrasenaValidar(ByVal obj As AplicacionBE, ByVal usuario As String,
                                            ByRef res As ResultadoBE)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.Codigo) Then
            res.detalle = "Requiere Código"
            Return
        End If
        res.flag = True
    End Sub

    Public Function AplicacionGuardar(ByRef obj As AplicacionBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                AplicacionValidar(srvEnt, obj, usuario, res, token)
                If (res.flag) Then
                    'Obtenemos resultado
                    res.flag = srvEnt.AplicacionGuardar(obj, usuario, token)
                    If (res.flag) Then
                        res.detalle = obj.Codigo.ToString()
                    Else
                        res.detalle = "Error al guardar sistema"
                    End If
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función AplicacionGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function AplicacionGuardarContrasena(ByRef obj As AplicacionBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                AplicacionContrasenaValidar(obj, usuario, res)
                If (res.flag) Then
                    'Generamos la Contraseña
                    obj.Contrasena = New EncriptacionBL().GenerarContrasena("T", obj.Codigo)
                    'Obtenemos resultado
                    res.flag = srvEnt.AplicacionGuardarContrasena(obj, usuario, token)
                    If (res.flag) Then
                        res.detalle = obj.Contrasena.ToString()
                    Else
                        res.detalle = "Error al guardar sistema"
                    End If
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función AplicacionGuardarContrasena", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function AplicacionEliminar(ByVal Codigo As String, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.AplicacionEliminar(Codigo, usuario, token)
                If (res.flag) Then
                    res.detalle = "Se eliminó el sistema (Código: " + Codigo + ")"
                Else
                    res.detalle = "Error al eliminar sistema"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función AplicacionEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

#Region "Rol"

    Private Sub RolValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                           ByVal obj As RolBE, ByVal usuario As String,
                           ByRef res As ResultadoBE)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.Nombre) Then
            res.detalle = "Requiere Nombre"
            Return
        End If
        If String.IsNullOrEmpty(obj.AplicacionCodigo) Then
            res.detalle = "Requiere Código de Aplicación"
            Return
        End If
        If String.IsNullOrEmpty(obj.TipoAsociacionValor) Then
            res.detalle = "Requiere Tipo de Asociación"
            Return
        End If
        If String.IsNullOrEmpty(obj.TipoExpiracionValor) Then
            res.detalle = "Requiere Tipo de Expiración"
            Return
        End If
        If String.IsNullOrEmpty(obj.AdministradorIndicador) Then
            res.detalle = "Requiere Indicador de Rol Administrador"
            Return
        End If
        If String.IsNullOrEmpty(obj.EstadoValor) Then
            res.detalle = "Requiere Estado"
            Return
        End If
        If String.IsNullOrEmpty(obj.Codigo) AndAlso obj.EstadoValor.Equals("0") Then
            res.detalle = "No es posible crear un rol como inactivo"
            Return
        End If
        res.flag = True
    End Sub

    Public Function RolGuardar(ByRef obj As RolBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Guardamos Rol
                RolValidar(srvEnt, obj, usuario, res)
                res.flag = res.flag AndAlso srvEnt.RolGuardar(obj, usuario, token)
                If res.flag Then
                    'Guardamos Lista de Rol - Recursos
                    If Not IsNothing(obj.ListaRolRecurso) Then
                        For Each objRR As RolRecursoBE In obj.ListaRolRecurso
                            If Not objRR Is Nothing Then
                                objRR.RolCodigo = obj.Codigo
                                RolRecursoValidar(srvEnt, objRR, usuario, res)
                                res.flag = res.flag AndAlso srvEnt.RolRecursoGuardar(objRR, usuario, token)
                                If Not res.flag Then
                                    res.detalle = "Error al guardar detalle rol-recurso"
                                    Exit For
                                End If

                            End If
                        Next
                    End If
                    res.detalle = "Se guardaron los datos del rol (Código: " + obj.Codigo.ToString() + ")"
                Else
                    res.detalle = "Error al guardar rol"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function RolEliminar(ByVal Codigo As String, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.RolEliminar(Codigo, usuario, token)
                If (res.flag) Then
                    res.detalle = "Se eliminó el rol (Código: " + Codigo + ")"
                Else
                    res.detalle = "Error al eliminar rol"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

#Region "Rol Admin"

    Private Sub RolAdminValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                           ByVal obj As RolAdminBE, ByVal usuario As String,
                           ByRef res As ResultadoBE, ByVal token As String)

        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.AplicacionCodigo) Then
            res.detalle = "Requiere Código de Aplicación"
            Return
        End If
        'If String.IsNullOrEmpty(obj.UsuarioCodigo) Then     'obj.UsuarioCodigo => Usuario Responsable
        '    res.detalle = "Requiere Administrador Responsable"
        '    Return
        'End If

        If String.IsNullOrEmpty(obj.NSAD_CODIGO) Then
            res.detalle = "Requiere Administrador Responsable"
            Return
        End If

        Select Case obj.TipoRestriccion

            Case TIPO_REST_Ambito

                If String.IsNullOrEmpty(obj.AmbitoCodigo) Then
                    res.detalle = "Requiere Código de Ámbito"
                    Return
                End If

                If Not String.IsNullOrEmpty(obj.AmbitoCodigo) Then
                    Dim oRolAdmin As New RolAdminBE()
                    oRolAdmin.NRAD_CODIGO = obj.NRAD_CODIGO   'If(obj.NRAD_CODIGO, DirectCast(DBNull.Value, Object))
                    oRolAdmin.AplicacionCodigo = obj.AplicacionCodigo
                    oRolAdmin.AplicacionNombre = obj.AplicacionNombre
                    oRolAdmin.ROL_ADMIN_RolNombre = obj.ROL_ADMIN_RolNombre
                    oRolAdmin.NSAD_CODIGO = obj.NSAD_CODIGO
                    oRolAdmin.UsuarioCodigo = obj.UsuarioCodigo
                    oRolAdmin.AmbitoTipo = obj.AmbitoTipo
                    oRolAdmin.AmbitoCodigo = obj.AmbitoCodigo
                    oRolAdmin.TipoRestriccion = obj.TipoRestriccion
                    If srvEnt.RolAdminListarTodo(oRolAdmin, usuario, token).Count > 0 Then
                        res.detalle = "Ya existe un ámbito asociado a esta restricción"
                        Return
                    End If
                End If

            Case TIPO_REST_Rol_Ambito

                If String.IsNullOrEmpty(obj.AmbitoCodigo) Then
                    res.detalle = "Requiere Código de Ámbito"
                    Return
                End If

                If String.IsNullOrEmpty(obj.ROL_ADMIN_RolCodigo) Then
                    Dim oRolAdmin As New RolAdminBE()
                    oRolAdmin.NRAD_CODIGO = obj.NRAD_CODIGO   'If(obj.NRAD_CODIGO, DirectCast(DBNull.Value, Object))
                    oRolAdmin.AplicacionCodigo = obj.AplicacionCodigo
                    oRolAdmin.AplicacionNombre = obj.AplicacionNombre
                    oRolAdmin.ROL_ADMIN_RolNombre = obj.ROL_ADMIN_RolNombre
                    oRolAdmin.NSAD_CODIGO = obj.NSAD_CODIGO
                    oRolAdmin.UsuarioCodigo = obj.UsuarioCodigo
                    oRolAdmin.AmbitoTipo = obj.AmbitoTipo
                    oRolAdmin.AmbitoCodigo = obj.AmbitoCodigo
                    oRolAdmin.TipoRestriccion = obj.TipoRestriccion
                    If srvEnt.RolAdminListarTodo(oRolAdmin, usuario, token).Count > 0 Then
                        res.detalle = "Ya existe un ámbito asociado a esta restricción"
                        Return
                    End If
                End If

            Case TIPO_REST_Rol

                If String.IsNullOrEmpty(obj.ROL_ADMIN_RolCodigo) Then
                    res.detalle = "Requiere Rol"
                    Return
                End If

            Case TIPO_REST_Rol_Ambito

        End Select

        res.flag = True
    End Sub

    Public Function RolAdminGuardar(ByRef obj As RolAdminBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Guardamos Rol
                RolAdminValidar(srvEnt, obj, usuario, res, token)

                If res.flag Then
                    res.flag = srvEnt.RolAdminGuardar(obj, usuario, token)
                    If res.flag Then

                        If obj.TipoRestriccion = TIPO_REST_Ambito Then
                            Dim resRA As New ResultadoBE()
                            Dim objRolAmbito As New RolAdminBE
                            objRolAmbito.NRAD_CODIGO = Nothing
                            objRolAmbito.NSAD_CODIGO = obj.NSAD_CODIGO
                            objRolAmbito.AmbitoTipo = obj.AmbitoTipo
                            objRolAmbito.AmbitoCodigo = obj.AmbitoCodigo
                            objRolAmbito.Estado = EstadoActivo
                            objRolAmbito.TipoRestriccion = TIPO_REST_Rol_Ambito
                            RolAdminValidar(srvEnt, objRolAmbito, usuario, resRA, token)
                            If resRA.flag Then
                                res.flag = srvEnt.RolAdminGuardar(objRolAmbito, usuario, token)
                            End If

                        End If

                        If res.flag Then
                            If Not obj.ROL_ADMIN_RolCodigo Is Nothing Then
                                res.detalle = "Se guardaron los datos del rol (Código: " + obj.ROL_ADMIN_RolCodigo.ToString() + ")"
                            Else
                                res.detalle = "Se guardaron los datos del ámbito (Código: " + obj.AmbitoCodigo + ")"
                            End If
                        Else
                            trn.Dispose()
                            res.detalle = "Error al guardar rol admin"
                        End If

                    Else
                        srvEnt.Close()
                        res.detalle = "Error al guardar rol admin"
                    End If
                End If

                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolAdminGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function RolAdminEliminar(ByVal Codigo As String, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.RolAdminEliminar(Codigo, usuario, token)
                If (res.flag) Then
                    res.detalle = "Se eliminó el rol (Código: " + Codigo + ")"
                Else
                    res.detalle = "Error al eliminar rol"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolAdminEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

#Region "Rol - Recurso"

    Private Sub RolRecursoValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                              ByVal obj As RolRecursoBE, ByVal usuario As String,
                              ByRef res As ResultadoBE)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.RolCodigo) Then
            res.detalle = "Requiere Código de Rol"
            Return
        End If
        If String.IsNullOrEmpty(obj.RecursoCodigo) Then
            res.detalle = "Requiere Código de Recurso"
            Return
        End If
        If String.IsNullOrEmpty(obj.EstadoValor) Then
            res.detalle = "Requiere Estado"
            Return
        End If
        res.flag = True
    End Sub

    Public Function RolRecursoGuardar(ByRef obj As RolRecursoBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                RolRecursoValidar(srvEnt, obj, usuario, res)
                If (res.flag) Then
                    'Obtenemos resultado
                    res.flag = srvEnt.RolRecursoGuardar(obj, usuario, token)
                    If (res.flag) Then
                        res.detalle = "Se guardaron los datos del Rol Recurso (Código: " + obj.Codigo.ToString() + ")"
                    Else
                        res.detalle = "Error al guardar rol recurso"
                    End If
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolRecursoGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function RolRecursoEliminar(ByVal Codigo As Integer, ByVal usuario As String, ByVal token As String) As Boolean

        'Variable de resulatdo
        Dim resultado As Boolean = False
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                resultado = srvEnt.RolRecursoEliminar(Codigo, usuario, token)
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RolRecursoEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return resultado
    End Function

#End Region

#Region "Sistema - Administrador"

    Private Sub SistemaAdminValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                              ByVal obj As SistemaAdminBE, ByVal usuario As String,
                              ByRef res As ResultadoBE, ByVal token As String)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.AplicacionCodigo) Then
            res.detalle = "Requiere Código de Aplicación"
            Return
        End If
        If String.IsNullOrEmpty(obj.UsuarioCodigo) Then
            res.detalle = "Requiere Código de Usuario Administrador"
            Return
        End If

        If String.IsNullOrEmpty(obj.TipoResponsable) Then
            res.detalle = "Requiere Tipo Responsable"
            Return
        End If
        If obj.TipoResponsable = TIPO_RESP_AdminSistema Then
            If String.IsNullOrEmpty(obj.RolAdministradorCodigo) Then
                res.detalle = "Requiere Código de Rol Administrador"
                Return
            End If

            If obj.RolAdministradorCodigo = AdminSistema_USR_INTERNO Or obj.RolAdministradorCodigo = AdminSistema_USR_INTERNO_EXTERNO Then
                If Left(obj.UsuarioCodigo, 1) = USR_EXTERNO_PRFIJO Then
                    res.detalle = "Usuario Externo no puede administradar usuarios internos"
                    Return
                End If
            End If

        Else
            obj.RolAdministradorCodigo = ""
        End If
        If IsNothing(obj.Codigo) Then
            Dim objBuscar As New SistemaAdminBE()
            objBuscar.AplicacionCodigo = obj.AplicacionCodigo
            objBuscar.UsuarioCodigo = obj.UsuarioCodigo
            objBuscar.TipoResponsable = obj.TipoResponsable
            'objBuscar.RolAdministradorCodigo = obj.RolAdministradorCodigo
            If srvEnt.SistemaAdminListarTodo(objBuscar, usuario, token).Count > 0 Then
                res.detalle = "El usuario ya posee el mismo nivel de Responsabilidad en el Sistema." '"Usuario ya es administrador del sistema"
                Return
            End If
        End If
        res.flag = True
    End Sub

    Public Function SistemaAdminGuardar(ByRef obj As SistemaAdminBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                SistemaAdminValidar(srvEnt, obj, usuario, res, token)

                If (res.flag) Then
                    'Obtenemos resultado
                    res.flag = srvEnt.SistemaAdminGuardar(obj, usuario, token)
                    If res.flag Then
                        res.detalle = "Se guardaron los datos del administrador del sistema (Código: " + obj.Codigo.ToString() + ")"
                        If obj.TipoResponsable = TIPO_RESP_AdminSistema Then
                            Dim oUsuarioRolBE As New UsuarioRolBE
                            oUsuarioRolBE.Codigo = 0
                            oUsuarioRolBE.ExpiracionIndicador = 0
                            oUsuarioRolBE.RolCodigo = obj.RolAdministradorCodigo
                            oUsuarioRolBE.UsuarioCodigo = obj.UsuarioCodigo
                            oUsuarioRolBE.EstadoValor = "2"

                            res = New UsuarioBL().UsuarioRolGuardar(oUsuarioRolBE, usuario, token)
                            If Not res.flag Then
                                res.detalle = "Error al guardar administrador del sistema"
                                trn.Dispose()
                            End If
                        End If
                    Else
                        res.detalle = "Error al guardar administrador del sistema"
                        trn.Dispose()
                    End If
                End If

                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función SistemaAdminGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            Finally
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function SistemaAdminEliminar(ByVal Codigo As Integer, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.SistemaAdminEliminar(Codigo, usuario, token)
                If (res.flag) Then
                    'res = New UsuarioBL().UsuarioRolEliminar(Codigo, usuario)
                    'If Not res.flag Then
                    '    res.detalle = "Error al eliminar administrador del sistema"
                    '    trn.Dispose()
                    'End If
                    res.detalle = "Se eliminó el administrador de sistema (Código: " + Codigo.ToString() + ")"
                Else
                    res.detalle = "Error al eliminar administrador de sistema"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función SistemaAdminEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

#Region "Recurso"

    Public Function RecursoValidarTipo(ByVal obj As RecursoBE) As ResultadoBE
        Dim res As New ResultadoBE
        res.flag = False

        Select Case obj.Tipo
            Case "B"    'B: Botón
                'If Not String.IsNullOrEmpty(obj.Menu) Then
                'res.detalle = "El Recurso no puede ser de tipo Menu"
                'Return res
                'End If
                If Not String.IsNullOrEmpty(obj.Login) Then
                    res.detalle = "El Recurso no puede ser de tipo Login"
                    Return res
                End If
                If Not String.IsNullOrEmpty(obj.ModoInvocacion) Then
                    res.detalle = "El Recurso no posee Modo de Invocación"
                    Return res
                End If

            Case "P"    'P: Página

                If String.IsNullOrEmpty(obj.ModoInvocacion) Then
                    res.detalle = "Requiere ModoInvocacion"
                    Return res
                End If

                res = RecursoExisteLogin(obj.CodigoAplicacion)
                Return res

            Case Else

        End Select

        res.flag = True
        Return res

    End Function

    Private Function RecursoExisteLogin(ByVal codigoSistema As String) As ResultadoBE
        Dim res As New ResultadoBE

        Return res

    End Function

    Private Function RecursoEliminarValidar(ByVal codigo As String, ByVal usuario As String) As Boolean

        Dim res As New ResultadoBE
        res.flag = False
        If String.IsNullOrEmpty(codigo) Then
            res.detalle = "Requiere Código"
            Return res.flag
        End If
        Return Not res.flag

    End Function

    Private Sub RecursoValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                              ByVal obj As RecursoBE, ByVal usuario As String,
                              ByRef res As ResultadoBE,
                              ByVal token As String)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.Nombre) Then
            res.detalle = "Requiere Nombre"
            Return
        End If
        If String.IsNullOrEmpty(obj.CodigoAplicacion) Then
            res.detalle = "Requiere Sistema"
            Return
        End If
        'If String.IsNullOrEmpty(obj.PadreRecurso) Then
        '    res.detalle = "Requiere PadreRecurso"
        '    Return
        'End If
        If String.IsNullOrEmpty(obj.Estado) Then
            res.detalle = "Requiere Estado"
            Return
        End If
        If String.IsNullOrEmpty(obj.Tipo) Then
            res.detalle = "Requiere Tipo"
            Return
        End If

        If Not String.IsNullOrEmpty(obj.Tipo) Then
            Select Case obj.Tipo
                Case "P"
                    If String.IsNullOrEmpty(obj.URL) Then
                        res.detalle = "Requiere URL"
                        Return
                    End If
                    If String.IsNullOrEmpty(obj.Descripcion) Then
                        res.detalle = "Requiere Descripcion"
                        Return
                    End If

                    If obj.Login = "1" Then
                        If Not String.IsNullOrEmpty(obj.ModoInvocacion) Then
                            res.detalle = "Login, no posee Modo Invocación."
                            Return
                        End If
                    End If

                Case "M"
                    If Not String.IsNullOrEmpty(obj.ModoInvocacion) Then
                        res.detalle = "Tipo Menú, no posee Modo Invocación."
                        Return
                    End If
                    If obj.Login = "1" Then
                        res.detalle = "Tipo Menú, no puede ser Login"
                        Return
                    End If

                Case "B"
                    If String.IsNullOrEmpty(obj.PadreRecurso) Then
                        res.detalle = "Requiere PadreRecurso"
                        Return
                    End If
                    If obj.Login = "1" Then
                        res.detalle = "Tipo Botón, no puede ser Login."
                        Return
                    End If

                    If Not String.IsNullOrEmpty(obj.ModoInvocacion) Then
                        res.detalle = "Tipo Botón, no posee Modo Invocación."
                        Return
                    End If

                    If Not String.IsNullOrEmpty(obj.URL) Then
                        res.detalle = "Tipo Botón, no posee URL"
                        Return
                    End If

                    If Not String.IsNullOrEmpty(obj.Codigo) Then
                        Dim oRecurso As New RecursoBE()
                        oRecurso.CodigoAplicacion = obj.CodigoAplicacion
                        oRecurso.PadreRecurso = obj.Codigo
                        If srvEnt.RecursoListarTodo(oRecurso, usuario, token).Count > 0 Then
                            res.detalle = "El Recurso posee recursos hijos. No puede ser de Tipo Botón."
                            Return
                        End If
                    End If
                    res.flag = True

            End Select

            'Validar si el nombre del recurso existe            
            obj.Codigo = IIf(String.IsNullOrEmpty(obj.Codigo), "N", obj.Codigo)

            If srvEnt.RecursoExisteNombre(obj, usuario, token) Then
                res.detalle = "Ya existe un recurso con el mismo nombre en el Sistema."
                Return
            End If


            'validar si es un recurso Login (unico por sistema)
            'DLATORRE
            ''If (Not String.IsNullOrEmpty(obj.Login)) And obj.Login = "1" Then
            ''    If srvEnt.RecursoExisteLogin(obj, usuario, token) Then
            ''        res.detalle = "Ya existe un recurso Login en el Sistema."
            ''        Return
            ''    End If
            ''End If

        End If

        res.flag = True
    End Sub

    Public Function RecursoGuardar(ByVal obj As RecursoBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                RecursoValidar(srvEnt, obj, usuario, res, token)
                If (res.flag) Then
                    'Obtenemos resultado
                    res.flag = srvEnt.RecursoGuardar(obj, usuario, token)
                    If (res.flag) Then
                        res.detalle = "Se guardaron los datos del recurso (Código: " + obj.Codigo.ToString() + ")"
                    Else
                        res.detalle = "Error al guardar recurso"
                    End If
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RecursoGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function RecursoGuardarOrden(ByVal obj As RecursoOrdenBE, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable de resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Guardamos Lista Nivel Uno
                If Not IsNothing(obj.ListaNivelUno) Then
                    For Each objRO As RecursoBE In obj.ListaNivelUno
                        res.flag = srvEnt.RecursoGuardarOrden(objRO, usuario, token)
                        If Not res.flag Then
                            res.detalle = "Error al guardar orden del recurso"
                            Exit For
                        End If
                    Next
                End If
                If res.flag Then
                    'Guardamos Lista Nivel Dos
                    If Not IsNothing(obj.ListaNivelDos) Then
                        For Each objRO As RecursoBE In obj.ListaNivelDos
                            res.flag = srvEnt.RecursoGuardarOrden(objRO, usuario, token)
                            If Not res.flag Then
                                res.detalle = "Error al guardar orden del recurso"
                                Exit For
                            End If
                        Next
                    End If
                End If

                If res.flag Then
                    'Guardamos Lista Nivel Tres
                    If Not IsNothing(obj.ListaNivelTres) Then
                        For Each objRO As RecursoBE In obj.ListaNivelTres
                            res.flag = srvEnt.RecursoGuardarOrden(objRO, usuario, token)
                            If Not res.flag Then
                                res.detalle = "Error al guardar orden del recurso"
                                Exit For
                            End If
                        Next
                    End If
                End If

                If res.flag Then
                    res.detalle = "Se guardaron los datos"
                End If

                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RecursoGuardarOrden", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function RecursoEliminar(ByVal codigo As String, ByVal usuario As String, ByVal token As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.RecursoEliminar(codigo, usuario, token)
                If (res.flag) Then
                    res.detalle = "Se eliminó el recurso (Código: " + codigo.ToString() + ")"
                Else
                    res.detalle = "Error al eliminar recurso"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función RecursoEliminar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

#Region "Accesos"

    Private Sub AccesoValidar(ByVal srvEnt As srvAplicacionENT.AplicacionENTClient,
                              ByVal obj As AccesoBE, ByVal usuario As String,
                              ByRef res As ResultadoBE)
        res.flag = False
        If String.IsNullOrEmpty(usuario) Then
            res.detalle = "Requiere Usuario"
            Return
        End If
        If String.IsNullOrEmpty(obj.TipoValor) Then
            res.detalle = "Requiere Tipo de Acceso"
            Return
        End If
        If String.IsNullOrEmpty(obj.AplicacionCodigo) AndAlso
            String.IsNullOrEmpty(obj.RolCodigo) AndAlso
            String.IsNullOrEmpty(obj.UsuarioCodigo) Then
            res.detalle = "Requiere alguna de las siguientes asociaciones Sistema/Rol/Usuario"
            Return
        End If
        res.flag = True
    End Sub

    Public Function AccesoGuardar(ByRef obj As AccesoBE, ByVal usuario As String) As ResultadoBE
        'Variable de resulatdo
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Aplicar Validaciones 
                AccesoValidar(srvEnt, obj, usuario, res)
                If (res.flag) Then
                    'Obtenemos resultado
                    res.flag = srvEnt.AccesoGuardar(obj, usuario)
                    If (res.flag) Then
                        res.detalle = "Se guardaron los datos del acceso (Código: " + obj.Codigo.ToString() + ")"
                    Else
                        res.detalle = "Error al guardar acceso"
                    End If
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                'Destruimos la transacción
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función AccesoGuardar", ex.Message.ToString, usuario)
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

    Public Function AccesoEliminar(ByVal Codigo As Integer, ByVal usuario As String) As ResultadoBE
        'Variable Resultado
        Dim res As New ResultadoBE()
        'Iniciamos la transacción
        Using trn As New TransactionScope(TransactionScopeOption.RequiresNew)
            Try
                'Instanciamos del servicio entidad 
                Dim srvEnt As New srvAplicacionENT.AplicacionENTClient()
                'Obtenemos resultado
                res.flag = srvEnt.AccesoEliminar(Codigo, usuario)
                If (res.flag) Then
                    res.detalle = "Se eliminó el acceso (Código: " + Codigo.ToString() + ")"
                Else
                    res.detalle = "Error al eliminar acceso"
                End If
                'Completamos la transacción
                trn.Complete()
                'Cerramos el servicio entidad
                srvEnt.Close()
                srvEnt = Nothing
            Catch ex As Exception
                sisAuditoria.GuardarEvento(sisAuditoria.EnumAuditoria.FATAL_ERROR, "Error en la función AccesoEliminar", ex.Message.ToString, usuario)
                'Destruimos la transacción
                trn.Dispose()
            End Try
        End Using
        'Devolvemos el resultado de la operación
        Return res
    End Function

#End Region

End Class
